<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- saved from url=(0069)http://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN" xml:lang="zh-CN" class="dj_webkit dj_chrome dj_contentbox"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>NEWT 程序设计指南</title>
<meta name="Keywords" content="NEWT, 文本方式 , 窗口开发工具 , Red Hat Linux ,linux tutorials, linux training, linux standards, linux code, linux resources, linux programming, open source standards, linux how to,IBM, linux 教程 , linux 培训 , linux 标准 , linux 代码 , linux 参考资料 , linux 编程 , 开放源码标准 , linux how to,, tttlca">
<meta name="Abstract" content="NEWT 是在 Linux 下一个基于文本方式的窗口开发工具，最初是为 Red Hat Linux 的安装程序而设计的。本文将告诉您怎样一步步使用 NEWT 为自己的应用程序加上文本方式下的窗口界面。">
<meta name="Description" content="NEWT 是在 Linux 下一个基于文本方式的窗口开发工具，最初是为 Red Hat Linux 的安装程序而设计的。本文将告诉您怎样一步步使用 NEWT 为自己的应用程序加上文本方式下的窗口界面。">

<!-- Masthead/footer -->
<link href="./newt-develop_files/dw-article-6.css" rel="stylesheet" title="www" type="text/css">
</head>
<body id="ibm-com" class="v17" aria-busy="false">
	<div id="ibm-top" class="ibm-landing-page ibm-no-scroll">

<!-- LAYOUT -->
<!-- LEADSPACE_BEGIN --> 
<div id="ibm-access-cntr" role="main"><div id="ibm-leadspace-head">
	<!-- LEADSPACE_BODY_BEGIN --> 
	<div id="ibm-leadspace-body">
			<!-- Title_Subtitle -->
			<h1>NEWT 程序设计指南</h1>
	</div>
	<!-- LEADSPACE_BODY_END --> 
	<!-- SUMMARY_BEGIN -->
	<div id="dw-summary-area" class="dw-summary-columns">
		<div class="ibm-col-6-4">
		<p>NEWT 是在 Linux 下一个基于文本方式的窗口开发工具，最初是为 Red Hat Linux 的安装程序而设计的。本文将告诉您怎样一步步使用 NEWT 为自己的应用程序加上文本方式下的窗口界面。</p>
		<p class="ibm-no-print ibm-ind-link">
		</p>
		</div>
		<div class="ibm-col-6-2 dw-toc-margin">
			<p class="dw-summary-author"><a href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html#authorN10019" class="ibm-popup-link" onclick="ibmweb.overlay.show(&#39;authorN10019&#39;,this);return false;" role="button">梁俊辉</a> (<a href="mailto:zeusliang@21cn.com?subject=NEWT%20%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E6%8C%87%E5%8D%97&cc=zeusliang@21cn.com">zeusliang@21cn.com</a>), 自由职业者</p>
<div id="authorN10019" class="ibm-common-overlay"><div class="ibm-body"><div class="ibm-main"><div class="ibm-title"><!--this is where the h2 usually
                                    goes--></div><div class="ibm-container ibm-alternate"><div class="ibm-container-body">
<p><!--.-->
梁俊辉,对Linux的网络应用和程序设计有浓厚兴趣。您可以通过电子邮件
        <a href="mailto:zeusliang@21cn.com?cc=zeusliang@21cn.com">zeusliang@21cn.com</a>跟他联系。
      </p><br><br></div></div></div></div><div class="ibm-footer"><!----></div></div>
			<p class="dw-summary-date">2010 年 9 月 20 日</p>
			
		</div>
	</div>
	<!-- SUMMARY_END -->
</div><div id="ibm-pcon">

<!-- BEGIN_IBM-CONTENT -->
<div id="ibm-content">

<!-- BEGIN_IBM-CONTENT-BODY -->
<div id="ibm-content-body">

<!-- BEGIN_IBM-CONTENT-MAIN -->
<div id="ibm-content-main">

<!-- 1_1_COLUMN_BEGIN -->
<div class="ibm-columns">
<div class="ibm-col-1-1">

<h2 id="major1">NEWT 简介</h2><p>
考虑到 Red Hat 
 Linux 有软盘安装这一安装方式，安装代码运行于有限的资源环境中，特别是在有限的文件空间中。NEWT 的大小一开始就成为一个重要的问题。为了最小化它所占的空间，NEWT 的设计思想有下面几点：</p><ol><li>NEWT 由 C 语言写成，而不是Ｃ＋＋</li><li>
 NEWT 所有窗口的生成都是基于堆栈的数据结构，窗口的外观都是统一的模板，不由程序员修改</li><li>输入设备只支持终端键盘</li></ol><p>
 NEWT 提供Ｃ语言的应用程序接口 (API)，它不直接进行低级屏幕操作，是在 S-Lang 库上实现的。
     </p><h3 id="minor1.1">组件 (Components)</h3><p>在 NEWT 中，每一个可显示的项目称为组件。组件主要有两类：Form 组件与非 Form 组件。非 Form 组件是除 Form 以外的所有组件。Form 逻辑地组织各个组件成为一个功能集。Form 是一个容器组件，让其他组件都装在其上，有点类似 gtk 中的垂直盒 (Vbox) 和水平盒 (Hbox)。当一个应用准备从用户中获得输入，就要 run 一个 Form，这也类似于 gtk 中的 gtk_widget_show()。Form 组件可以包含其他任何组件，也包含其他的 Form 作为子 Form。</p><p>
每一个组件都是由一个属于 newtComponent 数据类型的变量唯一标志，这一变量必须由生成该组件的函数建立，而不能由程序员自己建立。属于 newtComponent 数据类型的变量其实只是一个指针。</p><h3 id="minor1.2">NEWT 程序的开始与结束</h3><p>有三个函数是每个 NEWT 程序都必须用到的，头两个用于初始化系统。</p><div class="codesection"><pre class="displaycode"> int newtInit(void); 
 void newtCls(void);</pre></div><p>
 newtInit() 必须是每个 NEWT 程序第一个调用的函数，用于初始化数据结构和重置终端于 raw 模式。大多数应用在 newtInit() 后立即调用 newtCls()，newtCls() 用于清除屏幕，这个函数不是必须的，但有助于优化屏幕。</p><p>当一个 NEWT 程序准备结束时，就要调用以下函数。
 
       </p><div class="codesection"><pre class="displaycode"> int newtFinished(void);</pre></div><p>
 newtFinished() 恢复终端在调用 newtInit() 前的状态，重置原来的输入状态。若没调用这函数，终端需重启才能回到命令行状态。</p><h3 id="minor1.3">编译 NEWT 程序</h3><p>在 Linux 上用 gcc 编译时带 -lnewt 
参数。以下所说的函数都可在 /usr/include/newt.h（Red Hat Linux 
 7.1）中找到。</p><h3 id="minor1.4">标志</h3><p>NEWT 定义了若干个标志 (FLAG)，这里仅介绍常用的几个。</p><ul class="ibm-bullet-list"><li>NEWT_FLAG_RETURNEXIT 当在组件上按回车时程序退出</li><li>NEWT_FLAG_HIDDEN 输入不回显，大多数应用在输入密码的情况</li><li>NEWT_ENTRY_SCROLL 允许滚动输入</li><li>NEWT_FLAG_WRAP 换行时整个单词换行</li><li>NEWT_FLAG_BORDER 加边框</li><li>NEWT_FLAG_MULTIPLE 允许多选</li></ul><p>若要使用多个标志，可对多个标志进行与操作 ('|')。</p><h3 id="minor1.5">根窗口（root window）</h3><p>终端所显示的背景，只有不被任何窗口遮盖的部分称为根窗口。一般地，应用不需使用到根窗口，而把文字写到属于自己的窗口上。所有组件都不应放在根窗口上。根窗口只用于显示一些辅助信息，例如程序的作者姓名、版本等。NEWT 提供两种在根窗口显示文字的方式，它们是唯一能越出组件自己当前窗口写文字的 NEWT 函数。</p><div class="codesection"><pre class="displaycode"> void newtDrawRootText(int left, int top, const char * 
 text);</pre></div><p>
该函数用于在根窗口指定位置写出 text 字苻串，left 和 top 为字苻串 text 的开始处，left 是屏幕 x 坐标，top 是屏幕 y 坐标。
     </p><p>
 Left 和 top 允许为负数。屏幕坐标原点在显示器的左上角，x 坐标从原点出发至左向右增大，y 坐标从原点出发至上向下增大。点 (10,5) 表示以左上角为原点 x=10,y=5, 而 left,top 为负，表与为正数方向相对。点 (－10,5) 表以右上角为原点 x=10，因此点 (10,5) 与点 (-10,5) 在屏幕左右两边相对，同理点 (10,5) 与点 (10,-5) 在屏幕上下两边相对。</p><p>
在文本方式下，通常屏幕的最后一行用于显示帮助信息，如每个快捷键所对应的功能等。这一提示行称为帮助行（help 
 line）。正如前面所述，NEWT 是基于堆栈，压栈 Push 操作显示帮助行，出栈 Pop 操作删除帮助行。基于栈的操作后面还回遇到。</p><div class="codesection"><pre class="displaycode"> void newtPushHelpLine(const char * text); 
 void newtPopHelpLine(void);</pre></div><p>
 newtPushHelpLine() 用于显示帮助行，text 为所要显示的字苻串指针，若为 NULL 则显示缺省的帮助行。NewtPopHelpLine() 则删除帮助行。
     </p><h3 id="minor1.6">非正常退出　</h3><p>在缺省情况下，NEWT 程序不能非正常退出，尽管大多数 Unix 程序可以通过按 Ctrl-z 强迫退出，但在 NEWT 不支持此功能。因 NEWT 初始化时屏蔽所有终端信号。</p><div class="codesection"><pre class="displaycode"> typedef void (*newtSuspendCallback)(void); 
 void newtSetSuspendCallback(newtSuspendCallback cb);</pre></div><p>
但可通过调用 newtSetSuspendCallback() 实现 Ctrl-z 强迫退出的功能，cb 是相应的回调函数，它不带参数，只做清理工作，如 newtFinished（）等。早期 Red 
 Hat 
 Linux 的安装程序当运行到硬盘分区时，若你使用 Fdisk 则屏幕回到命令行状态运行 Fdisk 进行分区，退出 Fdisk 时又回到当前窗口。要实现这种功能，在回调函数中加入下面两个函数： 
       </p><div class="codesection"><pre class="displaycode"> void newtSuspend(void); 
 void newtResume(void);</pre></div><p>
 newtSuspend() 告诉 NEWT 程序回到终端初始化前的状态，做需要做的工作。如需要回到 NEWT 界面，调用 newtResume() 恢复。
     </p><h3 id="minor1.7">窗口</h3><p>
生成窗口有两种主要方式： 
       </p><div class="codesection"><pre class="displaycode"> int newtCenteredWindow(int width, int height, const char * title); 
 int newtOpenWindow(int left, int top, int width, int height, const char * title);</pre></div><p>
由名字可知，newtCenteredWindow() 在屏幕中心生成窗口，width 为窗口宽度，height 为窗口高度，title 为窗口标题字串指针，标题文字为红色。由 newtOpenWindow() 生成的窗口位置由 left,top 确定，其余参数同上。
     </p><p>所有窗口的删除都是用同一种方式，由于 NEWT 是基于堆栈来操作，只有在栈顶的窗口才能被删除，位于栈顶的窗口即当前你能看到的不被任何其他窗口遮盖的窗口。</p><div class="codesection"><pre class="displaycode"> void newtPopWindow(void);</pre></div><p>
这函数删除屏幕最顶层的窗口，并重画被该窗口遮盖的部分。
     </p><h3 id="minor1.8">Form</h3><p>
正如前述那样，Form 是一个容器组件，同一时间只能生成一个 Form，所有组件都必须放在 Form 上，然后运行它。生成一个 Form 用以下函数： 
       </p><div class="codesection"><pre class="displaycode"> newtComponent newtForm(newtComponent vertBar, const char * help, int flags);</pre></div><p>
 vertBar 是垂直滚动条，help 是提示信息，通常这两个参数都不会用到，用 NULL 即可，flags 就是前述的标志。该函数返回标志所生成的 Form 的变量。</p><p>把组件放在 Form 上用以下函数： 
       </p><div class="codesection"><pre class="displaycode"> void newtFormAddComponent(newtComponent form, newtComponent co); 
 void newtFormAddComponents(newtComponent form, ...);</pre></div><p>
 newtFormAddComponent() 只放一个组件在 Form 上，而 newtFormAddComponents() 则可放多个组件，最后用 NULL 结束。
     </p><p>然后就运行它： 
       </p><div class="codesection"><pre class="displaycode"> newtComponent newtRunForm(newtComponent form);</pre></div><p>
其中 Form 参数是 newtForm() 返回的变量。
     </p><p>删除一个 Form: 
       </p><div class="codesection"><pre class="displaycode"> void newtFormDestroy(newtComponent form);</pre></div><p>
当一个 Form 被删除时，其上的组件一同被删除，并释放内存资源。
     </p><h3 id="minor1.9">按钮</h3><p>几乎所有的 Form 都包含最小一个按钮。按钮分两类：完全按钮 (full 
 button) 和紧缩按钮 (compact 
 button)。完全按钮富有立体感，紧缩按钮则单调些。</p><div class="codesection"><pre class="displaycode"> newtComponent newtButton(int left, int top, const char * text); 
 newtComponent newtCompactButton(int left, int top, const char * text);</pre></div><p>
 newtButton() 生成完全按钮，letf,top 指定该按钮位置，text 是指向按钮文字的指针，该函数返回按钮的 newtComponent 变量。NewtCompactButton() 生成紧缩按钮，参数及返回值同上。
     </p><h3 id="minor1.10">标签</h3><p>标签是 NEWT 程序最简单的组件，用于显示给定的文本但不允许用户输入。</p><div class="codesection"><pre class="displaycode"> newtComponent newtLabel(int left, int top, const char * text); 
 void newtLabelSetText(newtComponent co, const char * text);</pre></div><p>
 newtLabel() 生成标签组件，并返回它的 newtComponent 变量，参数 left,top 指定标签组件位置，text 为给定的文本。NewtLabelSetText() 用于动态改变标签组件的文字，co 是要改变的标签组件，test 是要改变的字串指针。
     </p><h3 id="minor1.11">输入盒 (Entry Box)</h3><p>输入盒可让用户输入字符串到 Form 中然后由应用接收。</p><div class="codesection"><pre class="displaycode"> newtComponent newtEntry(int left, int top, const char * initialValue, 
     int width,char ** resultPtr, int flags); 
 void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd); 
 char * newtEntryGetValue(newtComponent co);</pre></div><p>
 newtEntry() 生成输入盒组件，其中 initialValue 为初始化字符串指针，若不需则用 NULL，width 为宽度，resultPtr 为指向当前输入的字符，flags 为标志。Flags 设为 NEWT_ENTRY_SCROLL，当输入的字串长度等于输入盒的宽度时输入盒将往后滚动，否则不能再输入；Flags 设为 NEWT_FLAG_HIDDEN 
输入不回显，主要应用于输入密码方面。NewtEntrySet() 用于动态地改变输入盒的内容，value 为字符串指针，cursorAtEnd 实质是一个逻辑变量，由于Ｃ语言没有逻辑类型变量，仅用 int 代替，若为０则表 TRUE，指定光标跟随，非０光标不跟随输入。NewtEntryGetValue() 返回输入的字串。
     </p><h3 id="minor1.12">检查盒 (Checkbox)</h3><p>检查盒可对其代表的内容通过按空格键切换预定的各种状态。</p><div class="codesection"><pre class="displaycode"> newtComponent newtCheckbox(int left, int top, const char * text, 
                  char defValue,const char * seq, char * result); 
 char newtCheckboxGetValue(newtComponent co);</pre></div><p>
 newtCheckbox() 生成一个检查盒，text 标明它所代表的内容，defValue 为缺省值也即初始值，seq 为切换的顺序，result 指向当前状态。如 defValue='@',seq="@*X", 则初始时为 [@], 当按空格键＝＝》 [*] 再按空格键＝＝》 [X]，如此循环。若 result 为 NULL 则需
 NewtCheckboxGetValue() 获取当前状态。
     </p><h3 id="minor1.13">单选按钮 (Radio Button)</h3><p>单选按钮的外观与检查盒非常相似。不同的是单选按钮是由若干个组成一个集合，当一个单选按钮被选中时，其他单选按钮则被清除。若集合中只有一个单选按钮，它总会被选中，因而就失去了选择的意义。</p><div class="codesection"><pre class="displaycode"> newtComponent newtRadiobutton(int left, int top, const char * text, 
     int isDefault, newtComponent prevButton); 
 newtComponent newtRadioGetCurrent(newtComponent setMember);</pre></div><p>
 newtRadiobutton() 建立单选按钮集合，text 为代表单选按钮的字符串指针，isDefault 是逻辑开关，为 1 表逻辑 TRUE, 初始状态为选中；为０表 FALSE，初始状态为不选中。若当前单选按钮是集合中的第一个，prevButton 为 NULL 让 newtRadiobutton() 自动建立一个集合；若不是第一个，prevButton 为前一个由 newtRadiobutton() 生成的单选按钮。
     </p><h3 id="minor1.14">范围 (Scale)</h3><p>范围组件通常用于制作水平进度条。</p><div class="codesection"><pre class="displaycode"> newtComponent newtScale(int left, int top, int width, long long fullValue); 
 void newtScaleSet(newtComponent co, unsigned long long amount);</pre></div><p>
 newtScale() 生成水平进度条，width 为宽度，fullValue 为进度条的最大值。NewtScaleSet() 用于设置进度条的值。
     </p><h3 id="minor1.15">文本盒 (Textbox)</h3><p>文本盒能让终端显示一个文本块。</p><div class="codesection"><pre class="displaycode"> newtComponent newtTextbox(int left, int top, int width, int height, int flags); 
 void newtTextboxSetText(newtComponent co, const char * text);</pre></div><p>
 newtTextbox() 建立一个文本盒，其中 flags 可设为 NEWT_FLAG_WRAP、NEWT_FLAG_SCROLL 和它们的与操作。文本盒建立后，由 newtTextbox() 填充文本。
     </p><h3 id="minor1.16">滚动条 (Scrollbar)</h3><div class="codesection"><pre class="displaycode"> newtComponent newtVerticalScrollbar(int left, int top, int height, 
                     int normalColorset, int thumbColorset);</pre></div><p>
 newtVerticalScrollbar() 生成滚动条，normalColorset 为滚动条颜色，thumbColorset 为滚动块颜色。
     </p><h3 id="minor1.17">列表盒 (Listboxe)</h3><p>列表和是 NEWT 中最重要的组件，允许多选或单选</p><div class="codesection"><pre class="displaycode"> newtComponent newtListbox(int left, int top, int height, int flags); 
 int newtListboxAppendEntry(newtComponent co, const char * text, const void * data); 
 void * newtListboxGetCurrent(newtComponent co); 
 void newtListboxSetWidth(newtComponent co, int width); 
 void newtListboxSetCurrent(newtComponent co, int num); 
 void newtListboxSetCurrentByKey(newtComponent co, void * key);</pre></div><p>
 newtListbox() 生产列表盒，flags 可设为 NEWT_FLAG_SCROLL、NEWT_FLAG_RETURNEXIT、NEWT_FLAG_BORDER、
 NEWT_FLAG_MULTIPLE 和它们的与操作。NewtListboxAppendEntry() 用于在当前列表盒最后追加一个列表项，每一个个列表项由 key 唯一标志，key 可为任意类型，只要能和其他列表项区别开来就可以了。data 为 key 数据。操作列表盒的函数还有：
     </p><div class="codesection"><pre class="displaycode">      void newtListboxSetEntry(newtComponent co, void * key, const char * text); 
 int newtListboxInsertEntry(newtComponent co, const char * text, 
           const void * data, void * key); 
 int newtListboxDeleteEntry(newtComponent co, void * key); 
 void newtListboxClear(newtComponent co);</pre></div><div class="ibm-alternate-rule"><hr></div><p class="ibm-ind-link ibm-back-to-top"><a href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html#ibm-pcon" class="ibm-anchor-up-link">回页首</a></p><h2 id="major2">例子 :</h2><div class="codesection"><pre class="displaycode"> #include &lt;newt.h&gt; 
 #include &lt;stdio.h&gt; 
 void rootwin_show() 
 { 
        newtCls(); 
        /* 请观察 left,top 为正数 , 为负数地情形 */ 
        newtDrawRootText(0, 0, "左上角"); 
        newtDrawRootText(-6, 0, "右上角"); 
        newtDrawRootText(0, -3, "左下角"); 
        newtDrawRootText(-6, -3, "右下角"); 
        /* 注意 helpline 缺省时的内容 */ 
        newtPushHelpLine(NULL); 
        newtRefresh(); 
        sleep(10); 
        newtPushHelpLine("我的帮助行"); 
        newtRefresh(); 
        sleep(3); 
        newtPopHelpLine(); 
        newtRefresh(); 
        sleep(1); 
 } 
 void label_button() 
 { 
        newtComponent form, label, entry, button,cb; 
        char * entryValue; 
        newtCls(); 
        newtCenteredWindow(50,10,"输入与标签演示"); 
        /*left,top 是相对于中心窗口而言 */ 
        label = newtLabel(10, 1, "请输入 :"); 
        entry = newtEntry(19, 1, NULL, 20, &amp;entryValue, 
                      NEWT_FLAG_SCROLL); 
        newtEntrySet(entry,"\0",0); 
        button = newtButton(10, 5, "完全按钮"); 
        cb=newtCompactButton(25,5,"紧缩按钮"); 
        form = newtForm(NULL,NULL, 0); 
        newtFormAddComponents(form, label, entry, button,cb, NULL); 
        newtRunForm(form); 
        if(*entryValue!='\0') 
        { 
                newtDrawRootText(0,0,"你输入了 :"); 
                newtDrawRootText(12,0,entryValue); 
        } 
        else 
                newtDrawRootText(0,0,"无输入 !"); 
        newtRefresh(); 
        newtFormDestroy(form); 
        sleep(5); 
 } 
 void check_radio() 
 { 
        newtComponent form, checkbox, rb[3], button,lable1,lable2; 
        char cbValue,cv[2]; 
        int i; 
        newtCls(); 
        newtOpenWindow(10, 8, 40, 11, "检查盒与单选盒演示"); 
        lable1 = newtLabel(2, 1, "检查盒 :"); 
        checkbox = newtCheckbox(10, 1, "A checkbox", ' ', " *X", &amp;cbValue); 
        lable2 = newtLabel(2, 4, "单选盒 :"); 
        rb[0] = newtRadiobutton(10, 3, "Choice 1", 1, NULL); 
        rb[1] = newtRadiobutton(10, 4, "Choice 2", 0, rb[0]); 
        rb[2] = newtRadiobutton(10, 5, "Choice 3", 0, rb[1]); 
        button = newtButton(15, 7, "退出"); 
        form = newtForm(NULL, NULL, 0); 
        newtFormAddComponent(form, checkbox); 
        newtFormAddComponent(form, lable1); 
        newtFormAddComponent(form, lable2); 
        for (i = 0; i &lt; 3; i++) 
                newtFormAddComponent(form, rb[i]); 
        newtFormAddComponent(form, button); 
        newtPushHelpLine("&lt; 空格健 &gt; 选择"); 
        newtRefresh(); 
        newtRunForm(form); 
        for (i = 0; i &lt; 3; i++) 
                if (newtRadioGetCurrent(rb[0]) == rb[i]) 
                {       newtDrawRootText(0, 0, "单选盒 :"); 
                        newtDrawRootText(9, 0, "第"); 
                        if(i==0)newtDrawRootText(11, 0,"1"); 
                        if(i==1)newtDrawRootText(11, 0,"2"); 
                        if(i==2)newtDrawRootText(11, 0,"3"); 
                        newtDrawRootText(12, 0, "个"); 
                 } 
        newtDrawRootText(0, 3, "检查盒状态 :"); 
        cv[0]=cbValue;cv[1]='\0'; 
        newtDrawRootText(13, 3, cv); 
        newtRefresh(); 
        newtFormDestroy(form); 
        sleep(5); 
 } 
 void test() 
 { 
        char message[] = "This is a pretty long message. It will be displayed "
                 "in a newt textbox, and illustrates how to construct "
                 "a textbox from arbitrary text which may not have "
                 "very good line breaks.\n\n"
                 "Notice how literal \\n characters are respected, and "
                 "may be used to force line breaks and blank lines."; 
        newtComponent form, text, button; 
        newtCls(); 
        text = newtTextboxReflowed(1, 1, message, 30, 5, 5, 0); 
        button = newtButton(12, newtTextboxGetNumLines(text) + 2, "退出"); 
        newtOpenWindow(10, 5, 37, 
                   newtTextboxGetNumLines(text) + 7, "文本盒"); 
        form = newtForm(NULL, NULL, 0); 
        newtFormAddComponents(form, text, button, NULL); 
        newtRunForm(form); 
        newtFormDestroy(form); 
 } 
 main() 
 { 
  newtComponent ls,fm; 
  int p = 1, q = 2, r = 3, s = 4, t = 5, *u; 
  newtInit(); 
  do { 
    newtCls(); 
    newtRefresh(); 
    newtDrawRootText(0,0,"这是我的一个 NEWT 演示程序"); 
    newtCenteredWindow(50,10,"请选择"); 
    ls = newtListbox(18,3,5,NEWT_FLAG_RETURNEXIT); 
    newtListboxAppendEntry(ls,"根窗口演示",&amp;p); 
    newtListboxAppendEntry(ls,"输入盒与按钮",&amp;q); 
    newtListboxAppendEntry(ls,"检查盒与单选盒",&amp;r); 
    newtListboxAppendEntry(ls,"文本盒",&amp;s); 
    newtListboxAppendEntry(ls,"退出 ",&amp;t); 
    newtPushHelpLine(" Move using the arrow keys and press ENTER to select"); 
    fm = newtForm(NULL,NULL,0); 
    newtFormAddComponents(fm,ls,NULL); 
    newtRunForm(fm); 
    u = newtListboxGetCurrent(ls); 
    newtPopWindow(); 
    newtFormDestroy(fm); 
    switch(*u) { 
    case 1: 
      rootwin_show(); 
      break; 
    case 2: 
      label_button(); 
      break; 
    case 3: 
      check_radio(); 
      break; 
    case 4: 
      test(); 
      break; 
    case 5: 
      newtFinished(); 
      exit(0); 
    } 
  } while(1); 
 }</pre></div><p>运行结果如下图 :</p><h5 id="fig1">运行结果</h5><img alt="运行结果" src="./newt-develop_files/mypic.png" width="726"><!--CMA ID: true--><!--Site ID: 10--><!--XSLT stylesheet used to transform this file: dw-document-html-7.0.xsl-->


</div>
</div>
<!-- 1_1_COLUMN_END -->

<!-- BOTTOM_BACK_TO_TOP -->
<div class="ibm-columns">
<div class="ibm-col-1-1">
	<div class="ibm-alternate-rule"><hr></div><p class="ibm-ind-link ibm-back-to-top"><a href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html#ibm-pcon" class="ibm-anchor-up-link">回页首</a></p>
</div>
</div>

</div>
<!-- END_IBM_CONTENT_MAIN -->

</div>
<!-- END_IBM_CONTENT_BODY -->

</div>
<!-- END_IBM_CONTENT -->

</div></div>
<!-- LEADSPACE_END -->


<!-- END_IBM_PCON -->

<!-- END_IBM-TOP -->
</div>

</body></html>